<?php
if (!defined('ROOT')) exit('ShuangYa');
/*
 * MySQL支持类 mysql.class.php
 * @package ShuangyYa
 * @category Library
 * @link http://www.sylingd.com/
*/
class mysql_class {
	private $linkID;
	private $dbInfo;
	private $result;
	static private $_instance=NULL;
	static public function getInstance () {
		if (!self::$_instance) self::$_instance=new self;
		return self::$_instance;
	}
	/*
	 * 初始化
	 * @access public
	*/
	public function __construct () {
		$this->linkID=array();
		$this->dbInfo=array();
		$this->result=array();
		if (defined('SQLHOST')) {
			$this->setConnectInfo('default',array('host'=>SQLHOST,'user'=>SQLUSER,'pwd'=>SQLPWD,'name'=>SQLNAME,'prefix'=>SQLPREFIX));
			$this->connect();
		}
	}
	/*
	 * 设置数据库基本信息
	 * @access public
	 * @param string $id 连接ID
	 * @param array $info 信息
	*/
	public function setConnectInfo ($id,$info) {
		if (isset($this->linkID[$id])) unset($this->linkID[$id]);
		$this->dbInfo[$id]=$info;
	}
	/*
	 * 获取所有结果
	 * @access public
	 * @param string $key 结果Key，查询时传递
	 * @param string $id 连接ID
	 * @return array
	*/
	public function GetAll ($key,$id='default') {
		$rs=$this->result[$id][$key];
		$rs->setFetchMode(PDO::FETCH_ASSOC);
		$rs=$rs->fetchAll();
		return $rs;
	}
	/*
	 * 释放结果
	 * @access public
	 * @param string $key 结果Key
	 * @param string $id 连接ID
	 * @return NULL
	*/
	public function free ($key,$id='default') {
		$this->result[$id][$key]=NULL;
	}
	/*
	 * 获取最后产生的ID
	 * @access public
	 * @param string $id 连接ID
	 * @return int
	*/
	public function GetLastId ($id='default') {
		return intval($this->linkID[$id]->lastInsertId());
	}
	/*
	 * 获取结果集中的一个结果
	 * @access public
	 * @param string $key 结果Key
	 * @param string $id 连接ID
	 * @return array/NULL
	*/
	public function GetArray ($key,$id='default') {
		if (!isset($this->result[$id][$key]) || empty($this->result[$id][$key])) return NULL;
		$rs=$this->result[$id][$key];
		$rs->setFetchMode(PDO::FETCH_ASSOC);
		$rs=$rs->fetch();
		return $rs;
	}
	/*
	 * 查询主函数
	 * @access public
	 * @param string $key 结果Key
	 * @param string $sql SQL语句
	 * @param array $data 参数
	 * @param string $id 连接ID
	 * @return NULL
	*/
	public function Query ($key,$sql,$data=NULL,$id='default') {
		$prepare_sql=str_replace('#@__',$this->dbInfo[$id]['prefix'],$sql);
		$st=$this->linkID[$id]->prepare($prepare_sql);
		if (is_array($data)) {
			foreach ($data as $k=>$v) $st->bindValue($k+1,$v);
		}
		try {
			$r=$st->execute(); //执行
			if ($r===FALSE) $this->DisplayError('SQL error',$sql,$st);
		} catch (PDOException $e) {
			$this->DisplayError('Fail to Execute',$sql,$e);
		}
		$this->result[$id][$key]=$st;
	}
	/*
	 * 显示SQL错误
	 * @access private
	 * @param string $info 错误说明
	 * @param string $sql 出错的SQL语句
	 * @return NULL
	*/
	private function DisplayError ($info,$sql,$error) {
		echo '<div id="sysqlerror"><h1 style="color:red">SY SQL Error!</h1><p style="color:#FF7A00">Error info:',$info,'</p><p style="color:green">Error SQL:',htmlspecialchars($sql),'</p><p style="color:blue">System info:';
		$errinfo=$error->errorInfo();
		echo htmlspecialchars($errinfo[2]),'</p>';
		exit;
	}
	/*
	 * 连接数据库
	 * @param string $id 连接ID
	 * @return void
	*/
	public function connect ($id='default') {
		$db=$this->dbInfo[$id];
		@list($dbhost,$dbport)=explode(':',$db['host']);
		!$dbport && $dbport=3306;
		$dsn='mysql:host='.$dbhost.';port='.$dbport.';dbname='.$db['name'].';charset=utf8';
		try {
			$this->linkID[$id]=new PDO($dsn,$db['user'],$db['pwd']); //初始化PDO
			$this->linkID[$id]->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE);
			$this->result[$id]=array();
		} catch (PDOException $e) {
			$this->DisplayError('Fail to connect to Database Server','**NO**',$e);
		}
	}
	/*
	 * 查询出一个结果，仅支持简单的SQL语句
	 * @access public
	 * @param string $sql SQL语句
	 * @param array $data 参数
	 * @param string $id 连接ID
	 * @return array
	*/
	public function GetOne ($sql,$data=NULL,$id='default') {
		if (!preg_match('/LIMIT ([0-9,]+)$/',strtolower($sql))) $sql.=' LIMIT 0,1';
		$this->Query('one',$sql,$data,$id);
		$r=$this->GetArray('one',$id);
		$this->free('one',$id);
		return $r;
	}
}
?>